﻿
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection.Metadata;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
using static System.Windows.Forms.DataFormats;
using static 摸鱼.全局类;
using 摸鱼;
using System.Windows.Threading;
using System.Windows.Controls;
using System.Xml.Linq;
using System.Collections.Concurrent;
using static 摸鱼.键鼠.钩子;
using static 摸鱼._数据库;

namespace 摸鱼
{
    public static class 事件
    {
        private static MainWindow 主窗体;
        private static Form 前景窗口;
        public static void 初始化(MainWindow MainW)
        {
            主窗体 = MainW;
            //键鼠钩子处理线程
            MoyuThreadPool.Post(() =>
            {
                键鼠.钩子.键盘Click += 键盘Click;
                结束键事件 += 核心.冷却;
                隐藏键事件 += 显示隐藏;
                截图键事件 += 开启截屏;
                键鼠.钩子.Start();
            });

            //创建新线程来执行初始化操作  
            MoyuThreadPool.Post(() =>
            {
                // 初始化前景Form的画板，使用黑色背景  
                摸鱼.前景窗口.画板 = new Mat(屏幕高度, 屏幕宽度, MatType.CV_8UC3, Scalar.All(0));
                摸鱼.前景窗口.窗体 = new 前景窗口(MainW);
                摸鱼.前景窗口.句柄 = 摸鱼.前景窗口.窗体.Handle;
                //摸鱼.前景窗口.Timer = new();
                //摸鱼.前景窗口.Timer.Tick += 摸鱼.前景窗口.定时刷新;
                //摸鱼.前景窗口.Timer.Interval = 5000;
                //摸鱼.前景窗口.Timer.Enabled = true;
                摸鱼.前景窗口.窗体.Show();
                while (true)
                {
                    System.Windows.Forms.Application.DoEvents();
                    MoyuDelay.Star(10);
                    while (摸鱼.前景窗口.任务s.TryDequeue(out var item))
                        item();
                }
            });
        }

        public static event Action<object, EventArgs> 结束键事件;
        public static event System.Action 截图键事件;
        public static event System.Action 隐藏键事件;

        public static void 开始键触发(_方案 启动方案)
        {
            启动方案 ??= 数据库.当前方案;
            核心.启动(启动方案, 数据库.当前步骤);
            子方案遍历(启动方案.子);

            void 子方案遍历(List<_方案> 方案s)
            {
                foreach (var item in 方案s)
                {
                    if (!核心.线程s.ContainsKey(item))
                        核心.启动(item, null);
                    if (item.子.Count != 0)
                        子方案遍历(item.子);
                }
            }
        }
        public static void 结束键触发()
        {
            MainWindow.任务s.Enqueue(() => 结束键事件?.Invoke(1, default));
        }
        public static void 截屏键触发(bool 获取区域 = false)
        {
            截图键事件?.Invoke();
        }
        public static void 隐藏键触发()
        {
            隐藏键事件?.Invoke();
        }
        private static bool 已处理;
        private static void 键盘Click(List<int> 按键信息, bool keydown)
        {
            switch (按键信息)
            {
                case var k when k.全部按下_符合逻辑顺序(数据库.开始快捷键, keydown):
                    开始键触发(数据库.当前方案);
                    break;
                case var k when k.全部按下_符合逻辑顺序(数据库.结束快捷键, keydown):
                    结束键触发();
                    break;
                case var k when k.全部按下_符合逻辑顺序(数据库.隐藏快捷键, keydown):
                    隐藏键触发();
                    break;
                case var k when k.全部按下_符合逻辑顺序(数据库.截图快捷键, keydown):
                    截屏键触发();
                    break;
            }
        }
        private static void 显示隐藏()
        {
            MainWindow.任务s.Enqueue(() =>
            {
                if (主窗体.Visibility == System.Windows.Visibility.Visible)
                    主窗体.Visibility = System.Windows.Visibility.Hidden;
                else
                    主窗体.Visibility = System.Windows.Visibility.Visible;
            });
        }
        private static void 开启截屏()
        {
            if (截屏.实例 != null)
                return;
#if DEBUG
            截屏.设置测试模式(false);
#endif
            截屏.实例.显示();
        }












    }
}
